#include<bits/stdc++.h> 
using namespace std;
// 	一间机房里，每天第一个登录的人负责开门，最后一个登出的负责锁门，需要根据登
//	录的记录来判断某天是谁开门和锁门的
//1.每个输入具有一个测试用例，每个测试用例包含了某1天的所有记录。第一行输入为
//	一个正整数M，表示记录的总数。
//2.随后跟着M行，每一行的格式为ID，Sign_in，Sign_out，分别表示一个人的编号与登
//  录登出时间，时间格式为HH:MM:SS，并且ID不超过15个字符
//3.对于每一个测试用例，输出当天锁门的ID和开门的ID，用空格隔开
//4.保证测试数据中登录时间比登出时间早，且不存在两个人在同时登录登出
//5.结构体，排序，set，运算符重载 

struct People_1{
	string ID;
	string Sign_in;
	People_1(string id, string in){
		this->ID = id;
		this->Sign_in = in;
	}
	bool operator<(const People_1 &a) const{
		return Sign_in < a.Sign_in;
	}
}; //该结构体用于记录每天的登录情况，通过重载<来实现set的从小到大的排序 
struct People_2{
	string ID;
	string Sign_out;
	People_2(string id, string out){
		this->ID = id;
		this->Sign_out = out;
	}
	bool operator<(const People_2 &a) const{
		return a.Sign_out < Sign_out;
	}
}; //该结构体用于记录每天的登出情况，通过重载<来实现set的从大到小的排序 

int main(){
	int M;
	cin>>M;
	set<People_1> peo_ins; //set的读取快，而且会自动排序，很方便 
	set<People_2> peo_outs;
	for(int i = 0; i<M;i++){
		string id, in, out;
		cin>>id>>in>>out;
		People_1 peo_in = People_1(id, in);
		People_2 peo_out = People_2(id, out);
		peo_ins.insert(peo_in);
		peo_outs.insert(peo_out);
	}
	set<People_1>::iterator it1; //声明一个People_1类型的迭代器 
	it1=peo_ins.begin(); //迭代器为peo_ins这个set的头部，也就是最早登录的人 
	cout<<(*it1).ID<<" "; //输出ta的ID，下同 
	cout<<(*peo_outs.begin()).ID<<endl; //也可以不用迭代器直接这样写，迭代器是为了遍历的，这里其实不需要遍历就可以简写成这样 
	return 0;
} 

